#ifndef SRC_LTB_TYPE_H_
#define SRC_LTB_TYPE_H_

#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>

#include "src/lta.h"
#include "src/ltarena.h"

/**构建规则。*/
typedef struct {
    char const* name;
    char const* depfile;
    lta_Strings cmd;
} ltb_Rule;

lta_ArrayOf(ltb_Rule, ltb_Rules);

/**（构建脚本中的）变量定义。*/
typedef struct {
    char const* name;
    lta_Strings value;
} ltb_Define;

lta_ArrayOf(ltb_Define, ltb_Defines);

/**构建过程定义。*/
typedef struct {
    char const* rule;
    lta_Strings in;
    lta_Strings out;
    ltb_Defines defines;
} ltb_Build;

lta_ArrayOf(ltb_Build, ltb_Builds);

/**目标类型。*/
typedef enum {
    ltb_Library = 0,
    ltb_Executable,
    ltb_Interface,
    ltb_Cflags,
    ltb_Ldflags,
} TargetType;

/**被构建的目标。*/
typedef struct {
    TargetType type;
    char const* name;
    lta_Strings public_deps;
    lta_Strings secret_deps;

    /* 库和程序。*/
    lta_Strings srcs;

    /* 编译或者链接参数。*/
    lta_Strings flags;
} Target;

lta_ArrayOf(Target, Targets);
lta_ArrayOf(Target const*, TargetRefs);

/**收集依赖时，标记是否是顶点目标。*/
typedef enum {
    ltb_IsTop,
    ltb_NotTop,
} ltb_TopType;

/**构建过程配置。*/
typedef struct {
    ltb_Defines defines;
    ltb_Rules rules;
    ltb_Builds builds;
    Targets targets;
    ltarena_Arena arena;
    lta_Strings cflags;
} ltb_Config;

#endif // SRC_LTB_TYPE_H_
